// ==UserScript==
// @name         油猴反诈脚本
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  反诈骗脚本，通过 IP 地址识别和域名信息查询功能，尽可能降低被骗的可能。
// @author       蓝色的太平洋
// @homepage     https://gitee.com/TaiPinYoung/oil-monkey-anti-fraud-script/raw/master/油猴反诈脚本.user.js
// @match        *://*/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=msn.cn
// @grant        GM_xmlhttpRequest
// ==/UserScript==

/**
显示消息框
@param {string} msg 消息内容
*/
function showMsg(msg) {
    let box = document.createElement('div')
    box.id = 'msg-box'
    box.style.position = 'fixed'
    box.style.backgroundColor = 'rgba(255, 255, 255, 0.6)'
    box.style.border = "1px solid #000"
    box.style.top = '0px'
    box.style.right = '20px'
    box.style.zIndex = '9999999'
    box.style.fontSize = '16px'
    box.style.textAlign = 'left'
    box.style.textWeight = '700'
    box.style.color = "#000"
    box.innerText = msg
    document.body.appendChild(box)
}

/**
隐藏消息框
*/
function hideMsg() {
    document.getElementById('msg-box').style.display = 'none'
}

/**
发送ajax请求
@param {string} url 请求的地址
*/
function request(url) {
    return new Promise(async (resolve, reject) => {
        GM_xmlhttpRequest({
            url,
            method: 'GET',
            onload(res){
                if(res.status == 200) {
                    resolve(JSON.parse(res.response))
                }
                else {
                    reject(res)
                }
            },
            onerror: reject
        })
    })
}

/**
日期格式化
@param {string} date_str 被格式化的日期字符串
*/
function date_format(date_str) {
    let date = new Date(date_str)
    return `${date.getFullYear()}-${date.getMonth()+1}-${date.getDate()}`

}

(function() {
    'use strict';

    // Your code here...
    // 消息框显示时间（秒）
    const MSG_SHOW_TIME = 10 * 1000
    // ip 地址检验正则
    const IP_REGEXP = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
    const DOUYACUN_TOKEN = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SWQiOiJlZWQ4ZmQ1ODBmYTRmNjkyIn0.d7qF_mjdXMC0R5M6f04Lnh6x61kaU4lqHT0Axt9xUOY`
    const host_name = location.hostname
    // 本地与局域网网站判断
    if (host_name === 'localhost'
    || host_name === '127.0.0.1'
    || /^10\./.test(host_name)
    || /^192\.168\./.test(host_name)) {
        return undefined
    }
    let req = null
    // IP 访问判断
    if (IP_REGEXP.test(host_name)) {
        req = request(`https://www.douyacun.com/api/openapi/geo/location?ip=${host_name}&token=${DOUYACUN_TOKEN}`)
        .then(res => {
            const data = res.data
            return `本网站直接通过 IP 访问，可信度较低，请小心填写敏感信息。
服务器所在位置:${data.country}${data.province}${data.city}
经纬度:${data.longitude},${data.latitude}`
        })
    } else {
        // 政府机构域名校验正则
        const GOV_REGEXP = /\.gov.cn$/
        // 政府机构域名识别
        const is_gov = GOV_REGEXP.test(host_name)
        // 查询whois信息
        req = request(`https://api.gmit.vip/Api/Whois?format=json&domain=${host_name}`)
            .then(res=>{
            const whois = res.data
            return `是否是政府网站：${is_gov?'是':'否'}
域名注册商:${whois.registrar}
域名注册人:${whois.registrant}
域名注册时间:${date_format(whois.registrationTime)}
域名到期时间:${date_format(whois.expirationTime)}`
        })
    }
    req.then(content=>{
        showMsg(content)
        setTimeout(hideMsg, MSG_SHOW_TIME)
    })
})();